package com.zhibang.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTCreationException;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.auth0.jwt.interfaces.JWTVerifier;

import java.io.Serializable;
import java.util.Date;

/**
 * JWT 工具类
 * 用于生成、验证和解析 JWT Token
 */
public class JwtUtil {

    // 密钥（建议从配置文件中读取，不要硬编码）
    private static final String SECRET_KEY = "xestcgvhuh656e47t8.'[[";

    // Token 过期时间（单位：毫秒）
    private static final long EXPIRATION_TIME = 0; // 24 小时

    /**
     * 生成 JWT Token
     *
     * @param userId 用户ID
     * @return 生成的 JWT Token
     */
    public static String generateToken(Serializable userId) {
        try {
            // 创建 HMAC SHA256 算法实例
            Algorithm algorithm = Algorithm.HMAC256(SECRET_KEY);

            // 设置 Token 的过期时间
            Date expireDate = new Date(System.currentTimeMillis() + EXPIRATION_TIME);

            // 创建 JWT Builder
            return JWT.create()
                    .withIssuedAt(new Date()) // 设置签发时间
                    .withClaim("userId", String.valueOf(userId)) // 添加自定义声明（用户ID）
                    .sign(algorithm); // 签名
        } catch (JWTCreationException exception) {
            // 处理 JWT 创建异常
            throw new RuntimeException("生成 JWT Token 失败", exception);
        }
    }

    /**
     * 验证 JWT Token 是否有效
     *
     * @param token JWT Token
     * @return 如果 Token 有效，返回 true；否则返回 false
     */
    public static boolean validateToken(String token) {
        try {
            // 创建 HMAC SHA256 算法实例
            Algorithm algorithm = Algorithm.HMAC256(SECRET_KEY);

            // 创建 JWT Verifier
            JWTVerifier verifier = JWT.require(algorithm).build();

            // 验证 Token
            verifier.verify(token);
            return true;
        } catch (JWTVerificationException exception) {
            // 处理 JWT 验证异常
            return false;
        }
    }

    /**
     * 从 JWT Token 中解析用户ID
     *
     * @param token JWT Token
     * @return 用户ID
     */
    public static String getUserIdFromToken(String token) {
        try {
            // 创建 HMAC SHA256 算法实例
            Algorithm algorithm = Algorithm.HMAC256(SECRET_KEY);

            // 创建 JWT Verifier
            JWTVerifier verifier = JWT.require(algorithm).build();

            // 解析 Token
            DecodedJWT jwt = verifier.verify(token);

            // 返回用户ID
            return jwt.getClaim("userId").asString();
        } catch (JWTVerificationException exception) {
            // 处理 JWT 验证异常
            throw new RuntimeException("解析 JWT Token 失败", exception);
        }
    }

}